home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Magazine / Online / OpenURL / Developer / Source / prefs_prefswin.c < prev    next >
C/C++ Source or Header  |  1999-09-26  |  16KB  |  436 lines

  1. /*
  2. ** OpenURL - MUI preferences for openurl.library
  3. ** Written by Troels Walsted Hansen <troels@thule.no>
  4. ** Placed in the public domain.
  5. **
  6. ** This module contains the code to the PrefsWin Window.mui subclass.
  7. */
  8.  
  9. #include "prefs_common.h"
  10. #include "prefs_main.h"
  11. #include "prefs_app.h"
  12. #include "prefs_prefswin.h"
  13. #include "prefs_applist.h"
  14. #include "prefs_browsereditwin.h"
  15. #include "prefs_mailereditwin.h"
  16.  
  17. /**************************************************************************/
  18.  
  19. static ULONG mNew       (struct IClass *cl, Object *obj, struct opSet *msg);
  20. static ULONG mGetPrefs  (struct IClass *cl, Object *obj, struct MUIP_PrefsWin_GetPrefs *msg);
  21. static ULONG mStorePrefs(struct IClass *cl, Object *obj, struct MUIP_PrefsWin_StorePrefs *msg);
  22. static ULONG mAbout     (struct IClass *cl, Object *obj, struct MUIP_PrefsWin_About *msg);
  23.  
  24. /**************************************************************************/
  25.  
  26. enum { MEN_ABOUT=1,MEN_ABOUTMUI,MEN_DEFAULTS,MEN_HIDE,MEN_QUIT,
  27.        MEN_MUISETTINGS,MEN_SNAPSHOT,MEN_UNSNAPSHOT };
  28.  
  29. struct NewMenu PrefsWinMenu[] =
  30. {
  31.     { NM_TITLE, "Project"                 , 0 ,0,0,(APTR)0               },
  32.     { NM_ITEM , "About..."                ,"?",0,0,(APTR)MEN_ABOUT       },
  33.     { NM_ITEM , "About MUI..."            ,"¿",0,0,(APTR)MEN_ABOUTMUI    },
  34.     { NM_ITEM , (STRPTR)NM_BARLABEL       , 0 ,0,0,(APTR)0               },
  35.     { NM_ITEM , "Restore defaults"        ,"R",0,0,(APTR)MEN_DEFAULTS    },
  36.     { NM_ITEM , (STRPTR)NM_BARLABEL       , 0 ,0,0,(APTR)0               },
  37.     { NM_ITEM , "Hide"                    ,"H",0,0,(APTR)MEN_HIDE        },
  38.     { NM_ITEM , (STRPTR)NM_BARLABEL       , 0 ,0,0,(APTR)0               },
  39.     { NM_ITEM , "Quit"                    ,"Q",0,0,(APTR)MEN_QUIT        },
  40.  
  41.     { NM_TITLE, "Settings"                , 0 ,0,0,(APTR)0               },
  42.     { NM_ITEM , "MUI..."                  ,"M",0,0,(APTR)MEN_MUISETTINGS },
  43.     { NM_ITEM , (STRPTR)NM_BARLABEL       , 0 ,0,0,(APTR)0               },
  44.     { NM_ITEM , "Snapshot window"         ,"W",0,0,(APTR)MEN_SNAPSHOT    },
  45.     { NM_ITEM , "Unsnapshot window"       ,"U",0,0,(APTR)MEN_UNSNAPSHOT  },
  46.  
  47.     { NM_END,NULL,0,0,0,(APTR)0 },    
  48. };    
  49.  
  50. /**************************************************************************/
  51.  
  52. static ULONG mNew(struct IClass *cl, Object *obj, struct opSet *msg)
  53. {
  54.     static const STRPTR tabs[] = { "Information", "Browsers", "Mailers", "Miscellaneous", NULL };
  55.  
  56.     Object *strip, *registerg, *browserl, *mailerl, *prehttpc, *mailtoc, *showc, 
  57.           *bringtofrontc, *newwindowc, *launchc, *saveb, *useb, *cancelb;
  58.  
  59.     obj = (Object *)DoSuperNew(cl, obj,
  60.         MUIA_Window_ID,          MAKE_ID('U', 'R', 'L', 'P'),
  61.         MUIA_Window_Title,       APPNAME " Library Preferences",
  62.         MUIA_Window_ScreenTitle, APPNAME " " APPVER "." APPREV " " __AMIGADATE__ " · " APPAUTHOR " · " APPEMAIL,
  63.         MUIA_Window_Menustrip,   strip = MUI_MakeObject(MUIO_MenustripNM, PrefsWinMenu, 0),
  64.         WindowContents, VGroup,
  65.             Child, registerg = RegisterObject,
  66.                 MUIA_Background,      MUII_RegisterBack,
  67.                 MUIA_CycleChain,      TRUE,
  68.                 MUIA_Register_Titles, tabs,
  69.  
  70.                 /* Information */
  71.  
  72.                 Child, VGroup,
  73.                     Child, MUI_NewObject("Listview.mui",
  74.                         MUIA_CycleChain,     TRUE,
  75.                         MUIA_Listview_Input, FALSE,
  76.                         MUIA_Listview_List,  FloattextObject,
  77.                             TextFrame,
  78.                             MUIA_Background, MUII_TextBack,
  79.                             MUIA_Floattext_Text, 
  80. "Welcome to the OpenURL preferences program.  OpenURL is a shared library for "
  81. "easily sending URLs from applications to browsers.  Follow the below steps to "
  82. "configure OpenURL to suit you."
  83. "\n\n"
  84. "1.  Go to the \"Browsers\" tab of this window."
  85. "\n\n"
  86. "2.  Delete any browsers you don't have installed, and add any that are "
  87. "missing from the defaults."
  88. "\n\n"
  89. "3.  Make sure all your browsers are configured with full path."
  90. "\n\n"
  91. "4.  Arrange the browsers according to your preference by dragging and "
  92. "dropping them in the list.  Browsers are given preference from top to "
  93. "bottom, if one isn't found or doesn't start, the library will use the "
  94. "next one.  (Note, the library first searches for any running browser "
  95. "before it launches a new one.)"
  96. "\n\n"
  97. "5.  Do the same for the Mailers, if you wish to use OpenURL's special "
  98. "mailto support."
  99. "\n\n"
  100. "6.  Go to the \"Miscellaneous\" tab set the checkmarks the way you prefer."
  101. "\n\n"
  102. "7.  Press \"Save\"."
  103. "\n\n"
  104. "8.  Enjoy troublefree operation, and lobby the authors of your favourite "
  105. "applications to support OpenURL. :)",
  106.                         End,
  107.                     End,
  108.                 End,
  109.  
  110.                 /* Browsers */
  111.  
  112.                 Child, browserl = AppListObject,
  113.                     MUIA_AppList_NodeNameOffset,     sizeof(struct MinNode) + sizeof(LONGBITS),
  114.                     MUIA_AppList_NodePathOffset,     sizeof(struct MinNode) + sizeof(LONGBITS) + UBN_NAME_LEN,
  115.                     MUIA_AppList_NodeSize,           sizeof(struct URL_BrowserNode),
  116.                     MUIA_AppList_NodeEditWinClass,   BrowserEditWinClass->mcc_Class,
  117.                     MUIA_AppList_NodeEditWinIDAttr,  MUIA_BrowserEditWin_Browser,
  118.                     MUIA_AppList_NodeEditWinLstAttr, MUIA_BrowserEditWin_ListObj,
  119.                     MUIA_AppList_NewNodeName,        "«New browser»",
  120.                 End,
  121.  
  122.                 /* Mailers */
  123.  
  124.                 Child, mailerl = AppListObject,
  125.                     MUIA_AppList_NodeNameOffset,     sizeof(struct MinNode) + sizeof(LONGBITS),
  126.                     MUIA_AppList_NodePathOffset,     sizeof(struct MinNode) + sizeof(LONGBITS) + UMN_NAME_LEN,
  127.                     MUIA_AppList_NodeSize,           sizeof(struct URL_MailerNode),
  128.                     MUIA_AppList_NodeEditWinClass,   MailerEditWinClass->mcc_Class,
  129.                     MUIA_AppList_NodeEditWinIDAttr,  MUIA_MailerEditWin_Mailer,
  130.                     MUIA_AppList_NodeEditWinLstAttr, MUIA_MailerEditWin_ListObj,
  131.                     MUIA_AppList_NewNodeName,        "«New mailer»",
  132.                 End,
  133.  
  134.                 /* Miscellaneous */
  135.  
  136.                 Child, VGroup,
  137.                     Child, VGroup,
  138.                         GroupFrameT("Options"),
  139.                         Child, HGroup,
  140.                             Child, prehttpc = myKeyCheckMark(FALSE, 'p'),
  141.                             Child, KeyLabel2("Prepend \"http://\" to URLs without a scheme.", 'p'),
  142.                             Child, RectangleObject, End,
  143.                         End,
  144.                         Child, HGroup,
  145.                             Child, mailtoc = myKeyCheckMark(FALSE, 'm'),
  146.                             Child, KeyLabel2("Send mailto: URLs to email application.", 'm'),
  147.                             Child, RectangleObject, End,
  148.                         End,
  149.                     End,
  150.  
  151.                     Child, VGroup,
  152.                         GroupFrameT("Defaults"),
  153.                         Child, HGroup,
  154.                             Child, showc = myKeyCheckMark(FALSE, 'i'),
  155.                             Child, KeyLabel2("Show/Uniconify browser.", 'i'),
  156.                             Child, RectangleObject, End,
  157.                         End,
  158.                         Child, HGroup,
  159.                             Child, bringtofrontc = myKeyCheckMark(FALSE, 'f'),
  160.                             Child, KeyLabel2("Bring browser screen to front.", 'f'),
  161.                             Child, RectangleObject, End,
  162.                         End,
  163.                         Child, HGroup,
  164.                             Child, newwindowc = myKeyCheckMark(FALSE, 'w'),
  165.                             Child, KeyLabel2("Open URL in new browser window.", 'w'),
  166.                             Child, RectangleObject, End,
  167.                         End,
  168.                         Child, HGroup,
  169.                             Child, launchc = myKeyCheckMark(FALSE, 'l'),
  170.                             Child, KeyLabel2("Launch browser if one isn't running.", 'l'),
  171.                             Child, RectangleObject, End,
  172.                         End,
  173.  
  174.                         Child, MUI_NewObject("Listview.mui",
  175.                             MUIA_CycleChain,     TRUE,
  176.                             MUIA_Listview_Input, FALSE,
  177.                             MUIA_Listview_List,  FloattextObject,
  178.                                 TextFrame,
  179.                                 MUIA_Background, MUII_TextBack,
  180.                                 MUIA_Floattext_Text, 
  181. "These settings are the global defaults that will be used if the applications "
  182. "don't override them when opening URLs."
  183. "\n\n"
  184. "For instance, if you prefer to have all URLs opened in a new browser window, "
  185. "simply check the corresponding setting.",
  186.                             End,
  187.                         End,
  188.                     End,
  189.                 End,
  190.             End,
  191.  
  192.             Child, ColGroup(3),
  193.                 Child, saveb   = SimpleButton("_Save"),
  194.                 Child, useb    = SimpleButton("_Use"),
  195.                 Child, cancelb = SimpleButton("_Cancel"),
  196.             End,
  197.         End,
  198.         TAG_MORE, msg->ops_AttrList);
  199.  
  200.     if(obj)
  201.     {
  202.         struct PrefsWin_Data *data = INST_DATA(cl, obj);
  203.         memset(data, '\0', sizeof(struct PrefsWin_Data));
  204.  
  205.         /* init instance data */
  206.  
  207.         data->RegisterGrpObj     = registerg;
  208.         get(browserl, MUIA_AppList_ListObj, &data->BrowserLstObj);
  209.         get(mailerl, MUIA_AppList_ListObj, &data->MailerLstObj);
  210.  
  211.         data->PreHTTPChkObj      = prehttpc;
  212.         data->MailtoChkObj       = mailtoc;
  213.         data->ShowChkObj         = showc;
  214.         data->BringToFrontChkObj = bringtofrontc;
  215.         data->NewWindowChkObj    = newwindowc;
  216.         data->LaunchChkObj       = launchc;
  217.  
  218.         data->SaveButObj         = saveb;
  219.         data->UseButObj          = useb;
  220.         data->CancelButObj       = cancelb;
  221.  
  222.         /* buttons */
  223.  
  224.         DoMethod(obj, MUIM_MultiSet, MUIA_CycleChain, TRUE,
  225.                  saveb, useb, cancelb, NULL);
  226.  
  227.         set(obj, MUIA_Window_DefaultObject, data->BrowserLstObj);
  228.  
  229.         /* Project menu */
  230.  
  231.         DoMethod((Object *)DoMethod(strip,MUIM_FindUData,MEN_ABOUT      ),MUIM_Notify,MUIA_Menuitem_Trigger,MUIV_EveryTime,obj,1,MUIM_PrefsWin_About);
  232.         DoMethod((Object *)DoMethod(strip,MUIM_FindUData,MEN_ABOUTMUI   ),MUIM_Notify,MUIA_Menuitem_Trigger,MUIV_EveryTime,MUIV_Notify_Application,2,MUIM_Application_AboutMUI,obj);
  233.         DoMethod((Object *)DoMethod(strip,MUIM_FindUData,MEN_DEFAULTS   ),MUIM_Notify,MUIA_Menuitem_Trigger,MUIV_EveryTime,obj,2,MUIM_PrefsWin_GetPrefs,TRUE);
  234.         DoMethod((Object *)DoMethod(strip,MUIM_FindUData,MEN_HIDE       ),MUIM_Notify,MUIA_Menuitem_Trigger,MUIV_EveryTime,MUIV_Notify_Application,3,MUIM_Set,MUIA_Application_Iconified,TRUE);
  235.         DoMethod((Object *)DoMethod(strip,MUIM_FindUData,MEN_QUIT       ),MUIM_Notify,MUIA_Menuitem_Trigger,MUIV_EveryTime,MUIV_Notify_Application,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit);
  236.  
  237.         /* Settings menu */
  238.  
  239.         DoMethod((Object *)DoMethod(strip,MUIM_FindUData,MEN_MUISETTINGS),MUIM_Notify,MUIA_Menuitem_Trigger,MUIV_EveryTime,MUIV_Notify_Application,2,MUIM_Application_OpenConfigWindow,0);
  240.         DoMethod((Object *)DoMethod(strip,MUIM_FindUData,MEN_SNAPSHOT   ),MUIM_Notify,MUIA_Menuitem_Trigger,MUIV_EveryTime,obj,2,MUIM_Window_Snapshot,1);
  241.         DoMethod((Object *)DoMethod(strip,MUIM_FindUData,MEN_UNSNAPSHOT ),MUIM_Notify,MUIA_Menuitem_Trigger,MUIV_EveryTime,obj,2,MUIM_Window_Snapshot,0);
  242.  
  243.         /* window notifies */
  244.  
  245.         DoMethod(obj, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, MUIV_Notify_Application, 2, MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);
  246.  
  247.         /* window buttons */
  248.  
  249.         DoMethod(data->SaveButObj,    MUIM_Notify, MUIA_Pressed, FALSE, obj, 2, MUIM_PrefsWin_StorePrefs, MUIV_PrefsWin_StorePrefs_Save);
  250.         DoMethod(data->UseButObj,     MUIM_Notify, MUIA_Pressed, FALSE, obj, 2, MUIM_PrefsWin_StorePrefs, MUIV_PrefsWin_StorePrefs_Use);
  251.         DoMethod(data->CancelButObj,  MUIM_Notify, MUIA_Pressed, FALSE, MUIV_Notify_Application, 2, MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);
  252.     }
  253.  
  254.     return((ULONG)obj);
  255. }
  256.  
  257. /**************************************************************************/
  258.  
  259. static ULONG mGetPrefs(struct IClass *cl, Object *obj, struct MUIP_PrefsWin_GetPrefs *msg)
  260. {
  261.     struct PrefsWin_Data *data = INST_DATA(cl,obj);
  262.     struct URL_Prefs *up;
  263.     STRPTR error = NULL;
  264.     struct URL_BrowserNode *bn;
  265.     struct URL_MailerNode *mn;
  266.  
  267.     if(msg->Defaults)
  268.         up = URL_GetDefaultPrefs();
  269.     else
  270.         up = URL_GetPrefs();
  271.  
  272.     /* get the openurl.library prefs */
  273.  
  274.     if(!up) error = "Couldn't get prefs from openurl.library.";
  275.     else if(up->up_Version != PREFS_VERSION)
  276.         error = "This version of this program doesn't know how\n"
  277.                 "to handle openurl.library prefs version %ld.";
  278.  
  279.     if(error)
  280.     {
  281.         MUI_Request(_app(obj), NULL, 0, "Error", "Abort", error, up ? up->up_Version : 0);
  282.         if(up) URL_FreePrefs(up);
  283.         return(FALSE);
  284.     }
  285.  
  286.     /* Browsers */
  287.  
  288.     set(data->BrowserLstObj, MUIA_List_Quiet, TRUE);
  289.     DoMethod(data->BrowserLstObj, MUIM_List_Clear);
  290.  
  291.     for(bn = (struct URL_BrowserNode *)up->up_BrowserList.mlh_Head;
  292.         bn->ubn_Node.mln_Succ;
  293.         bn = (struct URL_BrowserNode *)bn->ubn_Node.mln_Succ)
  294.     {
  295.         DoMethod(data->BrowserLstObj, MUIM_List_InsertSingle, bn, MUIV_List_Insert_Bottom);
  296.     }
  297.  
  298.     set(data->BrowserLstObj, MUIA_List_Quiet, FALSE);
  299.  
  300.     /* Mailers */
  301.  
  302.     set(data->MailerLstObj, MUIA_List_Quiet, TRUE);
  303.     DoMethod(data->MailerLstObj, MUIM_List_Clear);
  304.  
  305.     for(mn = (struct URL_MailerNode *)up->up_MailerList.mlh_Head;
  306.         mn->umn_Node.mln_Succ;
  307.         mn = (struct URL_MailerNode *)mn->umn_Node.mln_Succ)
  308.     {
  309.         DoMethod(data->MailerLstObj, MUIM_List_InsertSingle, mn, MUIV_List_Insert_Bottom);
  310.     }
  311.  
  312.     set(data->MailerLstObj, MUIA_List_Quiet, FALSE);
  313.  
  314.     /* Miscellaneous */
  315.  
  316.     set(data->PreHTTPChkObj,      MUIA_Selected, up->up_Flags & UPF_PREPENDHTTP);
  317.     set(data->MailtoChkObj,       MUIA_Selected, up->up_Flags & UPF_DOMAILTO);
  318.  
  319.     set(data->ShowChkObj,         MUIA_Selected, up->up_DefShow);
  320.     set(data->BringToFrontChkObj, MUIA_Selected, up->up_DefBringToFront);
  321.     set(data->NewWindowChkObj,    MUIA_Selected, up->up_DefNewWindow);
  322.     set(data->LaunchChkObj,       MUIA_Selected, up->up_DefLaunch);
  323.  
  324.     /* set the first entry active */
  325.  
  326.     set(data->BrowserLstObj, MUIA_List_Active, MUIV_List_Active_Top);
  327.     set(data->MailerLstObj, MUIA_List_Active, MUIV_List_Active_Top);
  328.  
  329.     /* if the prefs are not the defaults, show the "Browsers" tab */
  330.  
  331.     if(!msg->Defaults && !(up->up_Flags & UPF_ISDEFAULTS))
  332.         set(data->RegisterGrpObj, MUIA_Group_ActivePage, 1);
  333.  
  334.     URL_FreePrefs(up);
  335.  
  336.     return(TRUE);
  337. }
  338.  
  339. /**************************************************************************/
  340.  
  341. static ULONG mStorePrefs(struct IClass *cl, Object *obj, struct MUIP_PrefsWin_StorePrefs *msg)
  342. {
  343.     struct PrefsWin_Data *data = INST_DATA(cl,obj);
  344.     struct URL_Prefs up;
  345.     ULONG i;
  346.  
  347.     set(_app(obj), MUIA_Application_Sleep, TRUE);
  348.  
  349.     /* copy settings from gadgets into structure */
  350.  
  351.     up.up_Version = PREFS_VERSION;
  352.     NewList((struct List *)&up.up_BrowserList);
  353.     NewList((struct List *)&up.up_MailerList);
  354.  
  355.     /* Browsers */
  356.  
  357.     for(i = 0;; i++)
  358.     {
  359.         struct URL_BrowserNode *bn;
  360.  
  361.         DoMethod(data->BrowserLstObj, MUIM_List_GetEntry, i, &bn);
  362.         if(!bn) break;
  363.  
  364.         AddTail((struct List *)&up.up_BrowserList, (struct Node *)bn);
  365.     }
  366.  
  367.     /* Mailers */
  368.  
  369.     for(i = 0;; i++)
  370.     {
  371.         struct URL_MailerNode *mn;
  372.  
  373.         DoMethod(data->MailerLstObj, MUIM_List_GetEntry, i, &mn);
  374.         if(!mn) break;
  375.  
  376.         AddTail((struct List *)&up.up_MailerList, (struct Node *)mn);
  377.     }
  378.  
  379.     /* Miscellaneous */
  380.  
  381.     if(xget(data->PreHTTPChkObj, MUIA_Selected)) up.up_Flags |= UPF_PREPENDHTTP;
  382.     else up.up_Flags &= ~UPF_PREPENDHTTP;
  383.  
  384.     if(xget(data->MailtoChkObj, MUIA_Selected)) up.up_Flags |= UPF_DOMAILTO;
  385.     else up.up_Flags &= ~UPF_DOMAILTO;
  386.  
  387.     up.up_DefShow         = (BOOL)xget(data->ShowChkObj,         MUIA_Selected);
  388.     up.up_DefBringToFront = (BOOL)xget(data->BringToFrontChkObj, MUIA_Selected);
  389.     up.up_DefNewWindow    = (BOOL)xget(data->NewWindowChkObj,    MUIA_Selected);
  390.     up.up_DefLaunch       = (BOOL)xget(data->LaunchChkObj,       MUIA_Selected);
  391.  
  392.     /* save to disk */
  393.     
  394.     if(!URL_SetPrefs(&up, (msg->How == MUIV_PrefsWin_StorePrefs_Save)))
  395.         MUI_RequestA(_app(obj), obj, 0, "Error", "Abort", "Failed to save prefs", NULL);
  396.  
  397.     /* quit */
  398.  
  399.     set(_app(obj), MUIA_Application_Sleep, FALSE);
  400.     DoMethod(_app(obj), MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);
  401.  
  402.     return(TRUE);
  403. }
  404.  
  405. /**************************************************************************/
  406.  
  407. static ULONG mAbout(struct IClass *cl, Object *obj, struct MUIP_PrefsWin_About *msg)
  408. {
  409.     STRPTR version, author, copyright;
  410.  
  411.     get(_app(obj), MUIA_Application_Version,   &version);
  412.     get(_app(obj), MUIA_Application_Author,    &author);
  413.     get(_app(obj), MUIA_Application_Copyright, ©right);
  414.  
  415.     MUI_Request(_app(obj), obj, 0, APPNAME, "Ok", 
  416.                 "\33c\33b%s\33n\n\n%s\n\nWritten by\n%s\n%s",
  417.                 &version[6], copyright, author, APPEMAIL);
  418.  
  419.     return(TRUE);
  420. }
  421.  
  422. /**************************************************************************/
  423.  
  424. SAVEDS ASM ULONG PrefsWin_Dispatcher(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg)
  425. {
  426.     switch(msg->MethodID)
  427.     {
  428.         case OM_NEW                  : return(mNew         (cl,obj,(APTR)msg));
  429.         case MUIM_PrefsWin_GetPrefs  : return(mGetPrefs    (cl,obj,(APTR)msg));
  430.         case MUIM_PrefsWin_StorePrefs: return(mStorePrefs  (cl,obj,(APTR)msg));
  431.         case MUIM_PrefsWin_About     : return(mAbout       (cl,obj,(APTR)msg));
  432.     }
  433.  
  434.     return(DoSuperMethodA(cl,obj,msg));
  435. }
  436.